package study.designpattern.adapter.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import study.designpattern.adapter.LogDbOperateApi;
import study.designpattern.adapter.LogFileOperateApi;
import study.designpattern.adapter.bean.LogModel;
/**
 * 双向适配器：
 *     一个方向：把新的DB实现的接口适配成旧的文件操作需要的接口
 *     另一个方向：把文件操作的接口适配成新的Db实现的需要的接口
 * @author taowei20061122@163.com
 *
 */
public class TwoDirectAdapter implements LogDbOperateApi, LogFileOperateApi {
	/**
	 * 持有需要被适配的文件存储日志的接口对象
	 */
	private LogFileOperateApi fileLog;
	/**
	 * 持有需要被适配的Db存储日志的接口对象
	 */
	private LogDbOperateApi dbLog;
	
	/**
	 * 构造方法，传入需要被适配的对象
	 * @param fileLog
	 * @param dbLog
	 */
	public TwoDirectAdapter(LogFileOperateApi fileLog,LogDbOperateApi dbLog) {
		this.fileLog = fileLog;
		this.dbLog = dbLog;
	}
	
	
	/**以下内容是把Db操作的方式适配成文件实现方式的接口**/
	@Override
	public List<LogModel> readLogFile() {
		return dbLog.getAllLog();
	}

	@Override
	public void writeLogFile(List<LogModel> lsit) {
		//简单示意
		for (LogModel logModel : lsit) {
			dbLog.createLog(logModel);
		}

	}

	
	/**以下内容是把文件操作的方式适配成Db实现方式的接口**/
	@Override
	public void createLog(LogModel lm) {
		//1.先读取文件的内容
		List<LogModel> list = fileLog.readLogFile();
		
		if (list == null) {
			list = new ArrayList<LogModel>();
		}
		//2.加入新的日志对象
		list.add(lm);
		
		//3.重新写入文件
		fileLog.writeLogFile(list);

	}

	@Override
	public void updateLog(LogModel lm) {
		//1.先读取文件的内容
		List<LogModel> list = fileLog.readLogFile();
		
		//2.更新对象
		for (int i=0; i<list.size(); i++) {
			if (list.get(i).getLogId().equals(lm.getLogId())) {
				list.set(i, lm);
				break;
			}
		}
		//3.重新写入文件
		fileLog.writeLogFile(list);

	}

	@Override
	public void removeLog(LogModel lm) {
		//1.先读取文件的内容
		List<LogModel> list = fileLog.readLogFile();
		
		//2.加入新的日志对象
		list.remove(lm);
		
		//3.重新写入文件
		fileLog.writeLogFile(list);

	}

	@Override
	public List<LogModel> getAllLog() {
		return fileLog.readLogFile();
	}

}
